package negocio.bd;

import base.Peticion;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import utiles.ConexionBD;
import utiles.ConversorFecha;
import utiles.Logger;

/**
 * Clase para el manejo de las peticiones en la base de datos.
 * @author Efren
 * @version 0.0.1
 * @since 14/02/2013
 */
public class BDPeticiones {
    /**Variable para referirse al nombre de la columna en la base de datos*/
    public static String idPeticion = "idPeticion";
    /**Variable para referirse al nombre de la columna en la base de datos*/
    public static String dni = "dni";
    /**Variable para referirse al nombre de la columna en la base de datos*/
    public static String descripcion = "descripcion";
    /**Variable para referirse al nombre de la columna en la base de datos*/
    public static String fechaPeticion = "fechaPeticion";
    /**Variable para indicar que se desea realizar una busqueda por fecha*/
    public static int buscarPorFecha =1;
    /**Variable para indicar que se desea realizar una busqueda por DNI*/
    public static int buscarPorDNI =2 ;
    public static int buscarPorIdPeticion = 3;
    /**
     * Método para buscar la cadena seleccionada en el campo indicado por las variables estaticas. La opción por defecto es busqueda por DNI. La función busca cadenas que coincidan según se escribe.
     * @param campoBusqueda Variable estatica que indica el campo a buscar
     * @param busqueda Cadena con el texto a buscar. Para fechas convertir a String con formato DATETIME antes.
     * @return Un array de peticiones si se han encontrado coincidencias o null en caso contrario.
     */
    public static Peticion[] buscar(int campoBusqueda, String busqueda){
        Logger.printError("test");
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Peticion> peticiones = new ArrayList<>(0);
        try {
            String query = "SELECT * FROM `gestionTienda`.`Peticiones`";
            java.sql.Statement select =  db.createStatement();
            if (campoBusqueda == 1){
                query += " WHERE " + fechaPeticion + " <= '" + busqueda+"'";
            } else {
                query += " WHERE " + dni + " like '" + busqueda+"%'";
            }
            java.sql.ResultSet res = select.executeQuery(query);
            while (res.next()){
                Peticion temp = new Peticion();
                temp.setIdPeticion(res.getLong(idPeticion));
                temp.setCliente(BDClientes.obtenerCliente(res.getString(dni)));
                temp.setDescripcion(res.getString(descripcion));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaPeticion)));
                peticiones.add(temp);
            }
            res.close();
            select.close();
            return peticiones.toArray(new Peticion[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    /**
     * Método para obtener una petición especifica mediante su id.
     * @param idPeticion identificador de la petición en la base de datos.
     * @return La petición con el id especificado o null.
     */
    public static Peticion obtener(long idPeticion){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select =  db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Peticiones` WHERE " + BDPeticiones.idPeticion + " = " + idPeticion);
            if (res.next()){
                Peticion temp = new Peticion();
                temp.setIdPeticion(idPeticion);
                temp.setCliente(BDClientes.obtenerCliente(res.getString(dni)));
                temp.setDescripcion(res.getString(descripcion));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaPeticion)));
                select.close();
                res.close();
                return temp;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static Peticion buscarPeticionesNuevas(){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select =  db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Peticiones` WHERE fechaPeticion > DATE_SUB(CURDATE(),INTERVAL 1 MONTH)");
            if (res.next()){
                Peticion temp = new Peticion();
                temp.setIdPeticion(res.getLong(idPeticion));
                temp.setCliente(BDClientes.obtenerCliente(res.getString(dni)));
                temp.setDescripcion(res.getString(descripcion));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaPeticion)));
                select.close();
                res.close();
                return temp;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    public static Peticion obtener(String dni, GregorianCalendar fecha){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select =  db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Peticiones` WHERE " + BDPeticiones.dni + " = '" + dni + "' AND "+ BDPeticiones.fechaPeticion + " = '" + ConversorFecha.getFechaFormatoBD(fecha)+ "'");
            if (res.next()){
                Peticion temp = new Peticion();
                temp.setIdPeticion(res.getInt(idPeticion));
                temp.setCliente(BDClientes.obtenerCliente(res.getString(BDPeticiones.dni)));
                temp.setDescripcion(res.getString(descripcion));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaPeticion)));
                select.close();
                res.close();
                return temp;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    /**
     * Método que comprueba si existe una petición con el id especificado en la base de datos.
     * @param idPeticion 
     * @return 
     */
    public static boolean existe(long idPeticion){
        java.sql.Connection db = new ConexionBD().getConnection();
        try {
            java.sql.Statement select =  db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Peticiones` WHERE " + BDPeticiones.idPeticion + " = " + idPeticion);
            if (res.next()){
                select.close();
                res.close();
                return true;
            }
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return false;
    }
    /**
     * Método que obtiene todas las peticiones almacendas en la base de datos. 
     * @return Un array con las peticiones obtenidas
     */
    public static Peticion[] obtenerTodas(){
        java.sql.Connection db = new ConexionBD().getConnection();
        ArrayList<Peticion> peticiones = new ArrayList<>(0);
        try {
            java.sql.Statement select =  db.createStatement();
            java.sql.ResultSet res = select.executeQuery("SELECT * FROM `gestionTienda`.`Peticiones`");
            while (res.next()){
                Peticion temp = new Peticion();
                temp.setIdPeticion(res.getLong(idPeticion));
                temp.setCliente(BDClientes.obtenerCliente(res.getString(dni)));
                temp.setDescripcion(res.getString(descripcion));
                temp.setFecha(ConversorFecha.obtenerFecha(res.getString(fechaPeticion)));
                peticiones.add(temp);
            }
            res.close();
            select.close();
            return peticiones.toArray(new Peticion[0]);
        } catch (SQLException ex){
            Logger.printError(ex.getMessage());
        }return null;
    }
    /**
     * Método que inserta una petición en la base de datos.
     * @param peticion
     * @return 
     */
    public static boolean insertar(Peticion peticion){
        if (!existe(peticion.getIdPeticion())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement insert = db.prepareStatement("INSERT INTO `gestionTienda`.`Peticiones`(`dni` ,`descripcion` ,`fechaPeticion`) VALUES (?,?,?)");
                insert.setString(1,peticion.getCliente().getDni());
                insert.setString(2, peticion.getDescripcion());
                insert.setString(3, ConversorFecha.getFechaFormatoBD(peticion.getFecha()));
                insert.executeUpdate();
                return true;
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
    public static boolean actualizar(Peticion peticion){
        if (existe(peticion.getIdPeticion())){
            java.sql.Connection db = new ConexionBD().getConnection();
            try {
                java.sql.PreparedStatement update = db.prepareStatement("UPDATE  `gestionTienda`.`Peticiones` SET " + dni + " = ? " + descripcion + " = ? " + fechaPeticion + " = ? WHERE " + idPeticion + " = ?");
                update.setString(1,peticion.getCliente().getDni());
                update.setString(2,peticion.getDescripcion());
                update.setString(3, ConversorFecha.getFechaFormatoBD(peticion.getFecha()));
                update.setLong(4, peticion.getIdPeticion());
                if (update.executeUpdate() == 1){
                    return true;
                }
            } catch (SQLException ex){
                Logger.printError(ex.getMessage());
            }
        }return false;
    }
}
